package com.ragdollcat.thirdaicodegenerate.util;

import com.ragdollcat.thirdaicodegenerate.model.vo.app.FileContentVO;
import org.springframework.util.StringUtils;

import java.io.*;
import java.nio.charset.StandardCharsets;

public class FileContentUtil {

    /**
     * 递归遍历目录，查找指定文件名的文件
     * @param directory 待遍历的目录
     * @param fileName  目标文件名
     * @return 找到的文件（null表示未找到）
     */
    public static File findFileRecursively(File directory, String fileName) {
        if (directory == null || !directory.isDirectory()) {
            return null;
        }
        File[] files = directory.listFiles();
        if (files == null) {
            return null;
        }
        for (File file : files) {
            // 找到目标文件，直接返回
            if (file.isFile() && file.getName().equals(fileName)) {
                return file;
            }
            // 递归遍历子目录
            if (file.isDirectory()) {
                File found = findFileRecursively(file, fileName);
                if (found != null) {
                    return found;
                }
            }
        }
        return null;
    }

    /**
     * 根据根目录和文件名读取文件内容，封装响应
     * @param rootDirectoryPath 根目录全路径（如 "D:\\Idea_workspace\\2025\\third-ai-code-generate\\tmp\\code\\vue_project_340685275397222400_1"）
     * @param fileName          目标文件名（如 "CommentSection.vue"）
     * @return 包含文件内容、元数据和状态的响应DTO
     */
    public static FileContentVO getFileContent(String rootDirectoryPath, String fileName) {
        FileContentVO response = new FileContentVO();
        File rootDir = new File(rootDirectoryPath);

        // 校验根目录合法性
        if (!rootDir.exists()) {
            response.setSuccess(false);
            response.setErrorMessage("根目录不存在：" + rootDirectoryPath);
            return response;
        }
        if (!rootDir.isDirectory()) {
            response.setSuccess(false);
            response.setErrorMessage("根路径不是目录：" + rootDirectoryPath);
            return response;
        }

        // 递归查找目标文件
        File targetFile = findFileRecursively(rootDir, fileName);
        if (targetFile == null) {
            response.setSuccess(false);
            response.setErrorMessage("未找到文件：" + fileName + "（在目录 " + rootDirectoryPath + " 及其子目录中）");
            return response;
        }

        // 封装文件元数据
        response.setFileName(targetFile.getName());
        response.setFilePath(targetFile.getAbsolutePath());
        String extension = StringUtils.getFilenameExtension(targetFile.getName());
        response.setFileExtension(extension != null ? extension : "");

        // 读取文件内容（UTF-8编码，适配代码文件）
        try (BufferedReader reader = new BufferedReader(
                new InputStreamReader(new FileInputStream(targetFile), StandardCharsets.UTF_8))) {
            StringBuilder contentBuilder = new StringBuilder();
            String line;
            while ((line = reader.readLine()) != null) {
                contentBuilder.append(line).append(System.lineSeparator());
            }
            // 移除最后多余的换行符
            if (contentBuilder.length() > 0) {
                contentBuilder.setLength(contentBuilder.length() - System.lineSeparator().length());
            }
            response.setContent(contentBuilder.toString());
            response.setSuccess(true);
        } catch (IOException e) {
            response.setSuccess(false);
            response.setErrorMessage("读取文件失败：" + e.getMessage());
        }

        return response;
    }
}
